package com.kkw.netty.nio;

import com.kkw.utils.ByteBufferUtil;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;

/**
 * @author Kevin
 * @date 2021-09-22
 **/
public class Server {
    public static void main(String[] args) {
        // 创建缓冲区  单线程 阻塞模式下进行的测验  一个客户端发信息 另一个客户端不能够很好的正常工作
        // 单线程 非阻塞模式下 可以正常工作
        ByteBuffer buffer = ByteBuffer.allocate(16);
        // 获得服务器通道
        try(ServerSocketChannel server = ServerSocketChannel.open()) {
            // 为服务器通道绑定端口
            server.bind(new InetSocketAddress(8080));
            // 用户存放连接的集合
            ArrayList<SocketChannel> channels = new ArrayList<>();
            //非阻塞模式
//            server.configureBlocking(false);
            // 循环接收连接
            while (true) {
                System.out.println("before connecting...");
                // 没有连接时，会阻塞线程 线程停止运行了
                SocketChannel socketChannel = server.accept();
                //可以把通道也设置成非阻塞模式 这样它会影响read方法
//                socketChannel.configureBlocking(false);
                System.out.println("after connecting...");
                channels.add(socketChannel);
                // 循环遍历集合中的连接
                for(SocketChannel channel : channels) {
                    System.out.println("before reading");
                    // 处理通道中的数据
                    // 当通道中没有数据可读时，会阻塞线程
                    channel.read(buffer);//阻塞  socketChannel.configureBlocking(false); 就会是非阻塞
                    buffer.flip();
                    ByteBufferUtil.debugRead(buffer);
                    buffer.clear();
                    System.out.println("after reading");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
